#ifndef LIRESORTS_H
#define LIRESORTS_H 1

#include "ADDObjetBase.h"

#include <vector>

#include "SortsEcoles.h"

#include "Parser.h"

#include "StatusCode.h"

class ElementDOM;

/**
 * Classe qui crée la liste des sorts disponibles à partir du fichier
 * Joueur0/Donnees/ListeSorts.xml. Cette classe possède une instance
 * de parseur et est capable de lire les compétences martiales.
 *
 * L'idée est d'avoir une unique instance de LireSorts, car il faut
 * lire le fichier xml et créer la liste pour chaque instance.
 *
 * @author Johan "Solo" Luisier
 */
class LireSorts : public ADDObjetBase
{
 public:
  LireSorts();
  ~LireSorts();
  StatusCode init();
  const std::vector< std::vector< std::vector< SortsEcoles > > > *
    listeSorts() const;
  const std::vector< std::vector< SortsEcoles > > *
    listeSorts( const unsigned& ecole ) const;
  const std::vector< SortsEcoles > *
    listeSorts( const unsigned& ecole, const unsigned & niveau ) const;
  const bool& initialisationOK() const;
  static void setLevel( const unsigned & level, const unsigned& );
 protected:
  /**
   * Niveau de sortie des fonctions globales, très simples. On peut
   * changer cette constante en modifiant la ligne LireSorts::elementaire
   * du fichier CONFIG.
   */ 
  static DebugLevelType elementaire;
  /**
   * Liste des sorts, par école et par niveau.
   */
  std::vector< std::vector< std::vector< SortsEcoles > > > ListeSorts;
  /**
   * Parseur qui lit le fichier Joueur0/Donnees/ListeSorts.xml.
   */
  Parser parser;
  /**
   *
   */
  bool InitialisationOK;
 private:
 /**
  * Permet de déterminer si les niveaux de sorties ont bien été
  * initialisés.
  */                                                                           
  static bool niveauxLus;
  /**
   * Liste des noms des niveaux de sorties paramétrables.
   */
  static const std::vector< std::string > NomsNiveaux;
  std::vector< const ElementDOM * > trouverEcoles( const ElementDOM * elDom );
  std::vector< const ElementDOM * > trouverNiveaux( const ElementDOM * elDom );
  std::vector< const ElementDOM * > trouverSorts( const ElementDOM * elDom );
  std::string trouverNom( const ElementDOM * elDom );
  SortsEcoles lireSort( const ElementDOM * elDom, const unsigned & ecole,
			const unsigned & niveau );
};

const LireSorts * initLectureSortXML();

//static LireSorts listeSortsXML;

#endif // LIRESORTS_H
